package com.hmall.common.domain;

import com.hmall.common.utils.CollUtils;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * 多延迟消息类
 * 用于封装需要发送的延迟消息，支持多种延迟时间
 *
 * @param <T> 消息内容的类型
 */
@Data
@Slf4j
@NoArgsConstructor
@ApiModel(description = "多延迟消息")
public class MultiDelayMessage<T> {
    //消息内容
    private T data;
    //记录延迟时间的集合
    private List<Integer> delayMillis;

    /**
     * 构造函数，初始化消息内容和延迟时间集合
     *
     * @param data        消息内容
     * @param delayMillis 延迟时间集合
     */
    public MultiDelayMessage(T data, List<Integer> delayMillis){
        this.data = data;
        this.delayMillis = delayMillis;
    }

    /**
     * 静态工厂方法，用于创建MultiDelayMessage对象
     *
     * @param data        消息内容
     * @param delayMillis 可变参数形式的延迟时间
     * @param <T>         消息内容的类型
     * @return MultiDelayMessage对象
     */
    public static <T> MultiDelayMessage<T> of(T data, Integer... delayMillis) {
        return new MultiDelayMessage<>(data,
                CollUtils.newArrayList(delayMillis));
    }

    /**
     * 获取并移除下一个延迟时间
     *
     * @return 下一个延迟时间
     */
    public Integer removeNextDelay() {
        return this.delayMillis.remove(0);
    }

    /**
     * 判断是否还有下一个延迟时间
     *
     * @return 如果还有下一个延迟时间，返回true；否则返回false
     */
    public boolean hasNextDelay() {
        return !delayMillis.isEmpty();
    }
}
